package com.zzb.myshowme.presenter.impl;

import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.zzb.myshowme.model.SendSecurityCodeModel;
import com.zzb.myshowme.model.impl.SendSecurityCodeModelImpl;
import com.zzb.myshowme.presenter.SendSecurityCodePresenter;
import com.zzb.myshowme.utils.CustomToast;
import com.zzb.myshowme.view.IView.SendSecurityCodeView;

import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;

/**
 * Created by Administrator on 2016/10/19.
 */
public class SendSecurityCodePresenterImpl implements SendSecurityCodePresenter, SendSecurityCodeModel.OnIsRegisterFinishedListener{

    int time = 60;//发送短信倒计时
    private SendSecurityCodeView mSendSecurityCodeView;
    private SendSecurityCodeModel mSendSecurityCodeModel;

    public SendSecurityCodePresenterImpl(SendSecurityCodeView mSendSecurityCodeView){
        this.mSendSecurityCodeView = mSendSecurityCodeView;
        this.mSendSecurityCodeModel = new SendSecurityCodeModelImpl();
    }

    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                mSendSecurityCodeView.updateCodeTextTime(time);
                if (time == 0) {
                    time = 60;
                    mSendSecurityCodeView.setCodeTextEnabled(true);
                    mSendSecurityCodeView.setCodeText("获取验证码");
                }
            }else if (msg.what == 2) {
                int event = msg.arg1;
                int result = msg.arg2;
                Object data = msg.obj;

                if (result == SMSSDK.RESULT_COMPLETE) {////回调完成
                    if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {//获取验证码成功
                        mSendSecurityCodeView.showToast("验证码已经发送");

                    } else if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {////提交验证码成功
                        //验证成功后会通过EventHandler返回国家代码和电话号码
                        mSendSecurityCodeView.hideProgress();
//                        if(type.equals("regster")){
//                            ((PhoneRegsterActivity) getActivity()).gotoPhoneRegsterToMessgae();
//                        }else if(type.equals("password")){
//                            ((PhoneRegsterActivity) getActivity()).gotoGetPassword();
//                        }
                        mSendSecurityCodeView.goNext();
                        mSendSecurityCodeView.showToast("验证成功");

                    }

                } else if (result == SMSSDK.RESULT_ERROR) {//操作失败
                    mSendSecurityCodeView.hideProgress();
                    mSendSecurityCodeView.showToastError("请求失败,请重试");
                }
            }
        }
    };

    @Override
    public void onDestroyView(){
        SMSSDK.unregisterAllEventHandler();//注销绑定事件，与上面成对出现，否则出现内存泄漏
    }

    @Override
    public void iniSMSSDK(){
        EventHandler eh = new EventHandler() {
            @Override
            public void afterEvent(int event, int result, Object data) {
                Message m = new Message();
                m.what = 2;
                m.arg1 = event;
                m.arg2 = result;
                m.obj = data;
                mHandler.sendMessage(m);
            }
        };
        SMSSDK.registerEventHandler(eh); //注册短信回调
        SMSSDK.getSupportedCountries();//获取短信目前支持的国家列表，在监听中返回
    }

    /**
     * 验证短信验证码
     */
    @Override
    public void enterCode(String phone, String code) {
        mSendSecurityCodeView.showProgress();
        SMSSDK.submitVerificationCode("86", phone, code);//提交短信验证码，在监听中返回
    }

    /**
     * 判断该账号是否已注册
     */
    public void isRegster(String phone) {
//        mSendSecurityCodeView.setCodeTextEnabled(false);
        mSendSecurityCodeView.showProgress();
        mSendSecurityCodeModel.isRegister(phone, this);
    }

    /**
     * 获取短信验证码
     */
    @Override
    public void getCode(String phone){
        //  通过规则判断手机号
        if (!judgePhoneNums(phone)) {
            return;
        }
        mSendSecurityCodeView.setCodeTextEnabled(false);
        SMSSDK.getVerificationCode("86", phone);//请求获取短信验证码，在监听中返回

        mSendSecurityCodeView.updateCodeTextTime(time);
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (; time >= 0; time--) {
                    mHandler.sendEmptyMessage(1);
                    if (time == 0) {
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    /**
     * 判断手机号码是否合理
     *
     * @param phoneNums
     */
    private boolean judgePhoneNums(String phoneNums) {
        if (isMatchLength(phoneNums, 11) && isMobileNO(phoneNums)) {
            return true;
        }
        mSendSecurityCodeView.showToastError("手机号码输入有误！");
        return false;
    }

    /**
     * 判断一个字符串的位数
     *
     * @param str
     * @param length
     * @return
     */
    public static boolean isMatchLength(String str, int length) {
        if (str.isEmpty()) {
            return false;
        } else {
            return str.length() == length ? true : false;
        }
    }

    /**
     * 验证手机格式
     */
    public static boolean isMobileNO(String mobileNums) {
        /*
         * 移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
		 * 联通：130、131、132、152、155、156、185、186 电信：133、153、180、189、（1349卫通）
		 * 总结起来就是第一位必定为1，第二位必定为3或5或8，其他位置的可以为0-9
		 */
        String telRegex = "[1][358]\\d{9}";// "[1]"代表第1位为数字1，"[358]"代表第二位可以为3、5、8中的一个，"\\d{9}"代表后面是可以是0～9的数字，有9位。
        if (TextUtils.isEmpty(mobileNums))
            return false;
        else
            return mobileNums.matches(telRegex);
    }

    @Override
    public void onSuccess(String phone) {
        if (mSendSecurityCodeView != null) {
            mSendSecurityCodeView.enterCode();
//            getCode(phone);
        }
    }

    @Override
    public void onFailure(String error) {
        if (mSendSecurityCodeView != null) {
            mSendSecurityCodeView.hideProgress();
            mSendSecurityCodeView.showToastError(error);
        }
    }
}
